package com.note.app.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.note.common.domain.UserToken;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 用户Token Mapper
 */
@Mapper
public interface UserTokenMapper extends BaseMapper<UserToken> {

    /**
     * 查找用户有效的Token
     * @param userId 用户ID
     * @param token Token内容
     * @param now 当前时间
     * @return Token信息
     */
    @Select("SELECT * FROM user_token WHERE user_id = #{userId} AND token = #{token} " +
            "AND expired_at > #{now} AND status = 1 LIMIT 1")
    UserToken findValidToken(@Param("userId") Long userId, @Param("token") String token, 
                          @Param("now") LocalDateTime now);
    
    /**
     * 根据Token查找记录
     * @param token Token内容
     * @return Token信息
     */
    @Select("SELECT * FROM user_token WHERE token = #{token} LIMIT 1")
    UserToken findByToken(@Param("token") String token);
    
    /**
     * 更新上次活跃时间
     * @param id Token ID
     * @param lastActiveAt 上次活跃时间
     * @return 影响行数
     */
    @Update("UPDATE user_token SET last_active_at = #{lastActiveAt} WHERE id = #{id}")
    int updateLastActiveTime(@Param("id") Long id, @Param("lastActiveAt") LocalDateTime lastActiveAt);
    
    /**
     * 使指定用户的所有Token失效
     * @param userId 用户ID
     * @return 影响行数
     */
    @Update("UPDATE user_token SET status = 0 WHERE user_id = #{userId}")
    int invalidateAllTokens(@Param("userId") Long userId);
    
    /**
     * 获取用户所有有效Token
     * @param userId 用户ID
     * @param now 当前时间
     * @return Token列表
     */
    @Select("SELECT * FROM user_token WHERE user_id = #{userId} AND expired_at > #{now} AND status = 1")
    List<UserToken> findAllValidTokens(@Param("userId") Long userId, @Param("now") LocalDateTime now);
} 